package br.com.despesasPlan.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.com.despesasPlan.interfaces.InterfaceDao;
import br.com.despesasPlan.modelo.DespesaFixa;
import br.com.despesasPlan.sql.GenericSql;

public class DespesaFixaDao extends GenericDao implements InterfaceDao<DespesaFixa>{
	String[] campos = new String[3];
	private final static String TABELA = "despesas_fixas";

	public DespesaFixaDao() {
		this.campos[0] = "id";
		this.campos[1] = "id_pessoas";
		this.campos[2] = "valor";
	}
	
	private String getSqlInsert() {
		return GenericSql.getSqlInsert(TABELA, this.campos);
	}
	
	private String getSqlUpdate() {
		return GenericSql.getSqlUpdate(TABELA, this.campos);
	}
	
	private String getSqlDelete() {
		return GenericSql.getSqlDelete(TABELA, this.campos);
	}
	
	private String getSqlSelectList(ArrayList<Object> o) {
		StringBuilder sbSqlPessoaList = new StringBuilder(GenericSql.getSqlObjectList(TABELA, campos, o));
		return sbSqlPessoaList.toString();
	}
	
	private String getSqlSelect() {
		StringBuilder sbSqlPessoaList = new StringBuilder(GenericSql.getSqlObject(TABELA));
		return sbSqlPessoaList.toString();
	}
	
	private ArrayList<Object> getParamInsertSelect(DespesaFixa despesaFixa) {
		ArrayList<Object> paramList = new ArrayList<Object>();
		UtilDao utilDao = new UtilDao();
		long proximoId = utilDao.getProximoCodigo(TABELA);
		paramList.add(proximoId);
		if (despesaFixa.getIdPessoa() != null)
			paramList.add(despesaFixa.getIdPessoa());
		if (despesaFixa.getValor() != null)
			paramList.add(despesaFixa.getValor());
		return paramList;
	}
	
	private ArrayList<Object> getParamUpdate(DespesaFixa despesaFixa) {
		ArrayList<Object> paramList = new ArrayList<Object>();
		if (despesaFixa.getIdPessoa() != null)
			paramList.add(despesaFixa.getIdPessoa());
		if (despesaFixa.getValor() != null)
			paramList.add(despesaFixa.getValor());
		paramList.add(despesaFixa.getId());
		return paramList;
	}
	
	@Override
	public boolean adicionar(DespesaFixa d) {
		boolean isRegistroAdicionado = false;
		UtilDao utilDao = new UtilDao();
		String sqlAdicionar = getSqlInsert();
		ArrayList<Object> params = getParamInsertSelect(d);
		utilDao.executeSql(sqlAdicionar, params);
		isRegistroAdicionado = true;
		return isRegistroAdicionado;
	}

	@Override
	public boolean editar(DespesaFixa d) {
		boolean isRegistroAlterado = false;
		UtilDao utilDao = new UtilDao();
		String sqlAlterar = getSqlUpdate();
		ArrayList<Object> params = getParamUpdate(d);
		utilDao.executeSql(sqlAlterar, params);
		isRegistroAlterado = true;
		return isRegistroAlterado;
	}

	@Override
	public boolean remover(int i) {
		boolean isRegistroRemovido = false;
		UtilDao utilDao = new UtilDao();
		String sqlRemove = getSqlDelete();
		ArrayList<Object> params = new ArrayList<Object>();
		params.add(i);
		utilDao.executeSql(sqlRemove, params);
		isRegistroRemovido = true;
		return isRegistroRemovido;
	}

	@Override
	public ArrayList<DespesaFixa> getListByObjectValues(DespesaFixa d) {
		ArrayList<DespesaFixa> despesaFixaList = new ArrayList<DespesaFixa>();
		UtilDao utilDao = new UtilDao();
		ArrayList<Object> objects = new ArrayList<Object>();
		objects.add(d.getId());
		objects.add(d.getIdPessoa());
		objects.add(d.getValor());
		String sqlSelectList = getSqlSelectList(objects);
		try {
		ResultSet rs = utilDao.executeQuerySql(sqlSelectList, getParamInsertSelect(d));
		while (rs.next()) {
			DespesaFixa despesaFixa = new DespesaFixa();
			despesaFixa.setId(rs.getLong("id"));
			despesaFixa.setIdPessoa(rs.getLong("id_pessoas"));
			despesaFixa.setValor(rs.getDouble("valor"));
			despesaFixaList.add(despesaFixa);
		}
		} catch (SQLException e) {
			throw new RuntimeException("Erro ao buscar pessoa: "+e.getMessage());
		}
		return despesaFixaList;
	}

	@Override
	public DespesaFixa getValuesById(int i) {
		UtilDao utilDao = new UtilDao();
		String sqlSelect = getSqlSelect();
		DespesaFixa despesaFixa = new DespesaFixa();
		ArrayList<Object> params = new ArrayList<Object>();
		params.add(i);
		try {
		ResultSet rs = utilDao.executeQuerySql(sqlSelect, params);
		despesaFixa.setId(rs.getLong("id"));
		despesaFixa.setIdPessoa(rs.getLong("id_pessoas"));
		despesaFixa.setValor(rs.getDouble("valor"));
		} catch (SQLException e) {
			throw new RuntimeException("Erro ao buscar pessoa: "+e.getMessage());
		}
		return despesaFixa;
	}

}
